package xfuzzy.alg_genetico.indeterminado.xfghlOld.model;

import java.util.ArrayList;
//import java.util.Observable;
//import java.util.Observer;

import xfuzzy.xfhl.model.XfhlData;

/**
 * Clase que ajusta los cromosomas de una generaci�n
 * 
 * @author Sergio Cala Cordero, Marzo 2010, Herramienta Xfghl
 * 
 */
public class XfghlLearnSpecif {

	/**
	 * Generaci�n que se quiere ajustar
	 */
	private static XfghlGeneration generation = null;

	/**
	 * Configuraci�n de la herramienta
	 */
	private static XfghlConfig config = null;

	/**
	 * Atributo de clase para saber por d�nde voy recorriendo.
	 */
	private static int counter = 0;

	/**
	 * Getter and Setter
	 * 
	 * @return
	 */
	public static XfghlGeneration getGeneration() {
		return generation;
	}

	public static void setGeneration(XfghlGeneration generation) {
		XfghlLearnSpecif.generation = generation;
		// Contador de cromosomas a 0
		counter = 0;
	}

	/**
	 * Metodo que entrena todas los cromosomas de una generacion
	 */
	public static void learningSpecif() {

		// Creo las hebras y los datas
		XfghlThread[] thread = new XfghlThread[config.getNumThread()];
		XfhlData[] data = new XfhlData[config.getNumThread()];

		for (int i = 0; i < thread.length; i++) {
			data[i] = new XfhlData(i, config.getnumIterAjust());
			thread[i] = new XfghlThread(i, config, data[i]);
		}

		// Lanzo las hebras
		for (int i = 0; i < thread.length; i++) {
			thread[i].start();
		}

		// Espero por las hebras
		for (int i = 0; i < thread.length; i++) {
			try {
				thread[i].join();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		System.out.println("XfghlLearnSpecif: Termine el ajuste de la generacion");
	}

	/**
	 * @param config
	 *            the config to set
	 */
	public static void setConfig(XfghlConfig config) {
		XfghlLearnSpecif.config = config;
		counter = 0;
	}

	/**
	 * @return the config
	 */
	public static XfghlConfig getConfig() {
		return config;
	}

	/**
	 * Metodo que devuelve un cromosoma para ajustarlo
	 */
	public synchronized static XfghlChromosome getChromosome() {

		XfghlChromosome sal = null;

		// Comprobamos que no hayamos terminado
		if (counter < config.getNumChrom()) {
			ArrayList<XfghlChromosome> chrom = generation.getChromosomes();

			// Buscamos la estructura a entrenar si hay
			while (counter < config.getNumChrom() && chrom.get(counter).isLearned()) {
				counter++;
			}
			// Vemos si tenemos que devolver alguna
			if (counter < config.getNumChrom()) {
				sal = chrom.get(counter);
			}

			counter++;
		}

		return sal;
	}

}
